vlakna a zapis/cteni ze souboru

Otázka od: Lukas Jakubu

30. 6. 2004 13:59

dobry den,
ve sve aplikaci (mailovy klient) mam dve vlakna a nekolik datovych
souboru. Jedno vlakno pouze zapisuje stazene zpravy, druhe muze cist i
zapisovat. Dale mam napsanu tridu pro praci se soubory. Rad bych se
zeptal, jakym zpusobem by bylo nejvhodnejsi resit konflikty typu - prvni
vlakno zapisuje do souboru a druhe do nej potrebuje zapisovat take. Vim
ze existuji kriticke sekce ale nemuzu prijit na to, jak je v tomto
pripade pouzit. Pokud v hlavni unite (main.pas) vytvorim vlakno (jehoz
kod je v unite vlakno.pas) a v obou unitach (tj. vlakno.pas i main.pas)
vytvorim instanci tridy tsoubor (unita pro praci se soubory), pak nelze
zarucit ze obe vlakna nebudou najednou zapisovat do tehoz souboru. Jakym
zpusobem tedy zabranit "dvojitemu zapisu" do souboru?

Diky za napady
S pozdravem
--
**********************
* Lukas Jakubu *
* jerry.jacobi@wo.cz *
**********************

Odpovedá: Petr Daricek

30. 6. 2004 15:41

Ahoj,
  jestli te dobre chapu, tak vyuzivas kriticke sekce tim zpusobem ze v tride
tsoubor maz jednu polozku typu TCriticalSection, kterou vytvaris v
constructoru. To ale tak uplne nejde, protoze potom kazda instance teto tridy
ma vlastni kritickou sekci a tudiz nedojde ke kolizi.
  Kritickou sekci musis udelat bud jako globalni promenou, ktera se vytvori pri
inicializaci unity a nebo muzes pouzit mutexy nebo semaphory, ktere maji metodu
ktera vytvori dany synchronizacni objekt podle jmena a pokud uz v systemu
existuje pak jej vrati. Tim bys docilil toho, ze vsechny objekty budou pracovat
s tim samym mutexem.
                     Petr

Odpovedá: Vaclav Sazima

30. 6. 2004 16:04

Ahoj,
na praci se soubory pouzij nejlepe TFileStream a v Create nastav Mode na
fmWrite (nebo fmOpenReadWrite) or fmShareDenyWrite, pak je ale potreba
soubory neustale otvirat a zavirat, i kdyz pouze pro cteni by mohl byt
otevren stale.

druha moznost je pro main i vlakno pouzit stejnou instanci tsoubor a
jeji metody pro zapis osetrit kritickou sekci.

  Vaclav Sazima
Lukas Jakubu wrote:
> Jakym
> zpusobem tedy zabranit "dvojitemu zapisu" do souboru?
>
> Diky za napady
> S pozdravem